﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using DECOR.BL.BE;
using DECOR.BL.BC;

namespace DECOR.WinAppFotos
{
    public partial class frmCarga : Form
    {
        private MemoryStream ms;
   
        private Image imagen;
        private string rutaImagen;
        private string codMaterial;
     
        public frmCarga(string ruta, string codigoMat)
        {
            InitializeComponent();
            rutaImagen = ruta;
            codMaterial = codigoMat;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

            if (File.Exists(rutaImagen))
            {
             MemoryStream  imgrez  = new MemoryStream();
                Image img = Bitmap.FromFile(rutaImagen);
               img.Save(imgrez, img.RawFormat);

                RescalarImgvista(imgrez,img);
                imgrez.Dispose();
                img.Dispose();
                lblMensaje.Text = "Cambiar Imagen de Material";
                //pictureBox1.Image = Image.FromFile(rutaImagen);


            }
            else {

                pictureBox1.Image = Image.FromFile(ParametroBC.Instance.getParamValue("RutaImgDefecto"));

            }
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = Image.FromFile(ParametroBC.Instance.getParamValue("RutaImgDefecto"));
            Stream myStream = null;
            //openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "jpg files (*.jpg)|*.jpg" ;
            openFileDialog1.FilterIndex = 1;
            openFileDialog1.RestoreDirectory = true;


            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((myStream = openFileDialog1.OpenFile()) != null)
                    {
                        using (myStream)
                        {
                            // codigo de entrada
                            //cargo la imagen desde el open file dialog, luego cargo a un memory stream
                            imagen = Bitmap.FromFile(openFileDialog1.FileName);
                            ms = new MemoryStream();
                            imagen.Save(ms, imagen.RawFormat);

                          
                            ms = ResizeImageFile(ms, Convert.ToInt32(ParametroBC.Instance.getParamValue("AltoImg")), Convert.ToInt32(ParametroBC.Instance.getParamValue("AnchoImg")));
                            //controlo que la imagen generada sea menos de 40 kb
                            if (ms.Length > Convert.ToInt32(ParametroBC.Instance.getParamValue("PesoMaxImgGen")))
                            {
                                MessageBox.Show("Debe ingresar imagenes con un peso menor");
                                //rs.Dispose();
                                ms.Dispose();
                            }
                            else
                            {
                                imagen = Bitmap.FromStream(ms);

                                RescalarImgvista(ms,imagen);
                             
                            }

                           




                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex.Message);
                }
            }
            else {
                //si pongo cancelar en el openfiledialog
                if (File.Exists(rutaImagen))
                {
                    MemoryStream imgrez2 = new MemoryStream();
                    Image img2 = Bitmap.FromFile(rutaImagen);
                    img2.Save(imgrez2, img2.RawFormat);
                    RescalarImgvista(imgrez2, img2);
                    img2.Dispose();
                    imgrez2.Dispose();
                }
                else {

                    pictureBox1.Image = Image.FromFile(ParametroBC.Instance.getParamValue("RutaImgDefecto"));

                }
            }
        }
//funcion para reducir las imagenes
public static MemoryStream ResizeImageFile(MemoryStream imageFile, int targetSizeH,int targetSizeW )
{
    Image original = Image.FromStream(imageFile);
    int targetH, targetW;
    if (original.Height > original.Width)
    {
        targetH = targetSizeH;
        targetW = (int)(original.Width * ((float)targetSizeH / (float)original.Height));
    }
    else
    {
        targetW = targetSizeW;
        targetH = (int)(original.Height * ((float)targetSizeW / (float)original.Width));
    }
    Image imgPhoto = Image.FromStream(imageFile);
  
    Bitmap bmPhoto = new Bitmap(targetW, targetH, PixelFormat.Format32bppRgb);
    int calidad = Convert.ToInt32(ParametroBC.Instance.getParamValue("CalidadImg"));
    bmPhoto.SetResolution(calidad, calidad);
    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.SmoothingMode = SmoothingMode.HighQuality;
    grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
    grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
    grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel);
 
    MemoryStream mm = new MemoryStream();
    bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg);
    original.Dispose();
    imgPhoto.Dispose();
    bmPhoto.Dispose();
    grPhoto.Dispose();
    
    return mm;
}
private void RescalarImgvista(MemoryStream gr, Image imagen2) {
    //MemoryStream rs2 = new MemoryStream();
    if (imagen2.Height > 200 || imagen2.Width > 200)
    {
        gr = ResizeImageFile(gr, 200, 200);

        pictureBox1.Image = Image.FromStream(gr);
      
    }
    else {
        pictureBox1.Image = Image.FromStream(gr);
     

    }
    //rs2.Dispose();
    gr.Close();
    gr.Dispose();

}
private void btnGuardar_Click(object sender, EventArgs e)
{

    try
    {
        // pictureBox1.Image = Image.FromFile(ParametroBC.Instance.getParamValue("RutaImgDefecto"));
        string nomArchivo = string.Concat(codMaterial, ".jpg");
        string saverut = nomArchivo;   //ParametroBC.Instance.getParamValue("RutaImagen") + nomArchivo;

        //guardo la imagen temporalmente
        imagen.Save(saverut, ImageFormat.Jpeg);
        imagen = null;
        //MandarFTP(saverut, ParametroBC.Instance.getParamValue("RutaImagenServ"), ParametroBC.Instance.getParamValue("User"), ParametroBC.Instance.getParamValue("Password"));
        FileInfo gh = new FileInfo(saverut);
        DirectoryInfo dir = new DirectoryInfo(ParametroBC.Instance.getParamValue("RutaLecturaImg"));

        if (dir.Exists)
        {

            //copiamos de la ruta original a la ruta
            if (File.Exists(rutaImagen))
            {

                ms.Close();
                GC.Collect();
                GC.WaitForPendingFinalizers();
                File.Delete(rutaImagen);
                gh.CopyTo(ParametroBC.Instance.getParamValue("RutaLecturaImg") + @"\" + saverut);

            }
            else
            {
                ms.Close();
                GC.Collect();
                GC.WaitForPendingFinalizers();
                gh.CopyTo(ParametroBC.Instance.getParamValue("RutaLecturaImg") + @"\" + saverut);

            }
        }

        File.Delete(saverut);

        //imagen.Dispose();
        //rs.Dispose();
        ms.Dispose();


        this.Close();

    }
    catch { MessageBox.Show("Debe abrir una foto primero para guardarla"); }
}

private void btnCancelar_Click(object sender, EventArgs e)

{
    try
    {
        imagen.Dispose();
    
        ms.Dispose();
        this.Close();
    }
    catch { this.Close(); }
}

        //funcion para mandar el el archivo por ftp
//public void MandarFTP(string FilePath, string RemotePath, string Login, string Password)
//{
//    using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
//    {
//        string url = Path.Combine(RemotePath, Path.GetFileName(FilePath));

//        // Creo el objeto ftp
//        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(url);
//        //asigno el login y pass
     
//        ftp.Credentials = new NetworkCredential(Login, Password);

//        ftp.KeepAlive = false;
//        ftp.Method = WebRequestMethods.Ftp.UploadFile;
//        ftp.UseBinary = true;
//        ftp.ContentLength = fs.Length;
//        ftp.Proxy = null;
//        fs.Position = 0;

     
//        int buffLength = 2048;
//        byte[] buff = new byte[buffLength];

//        int contentLen;
//        //subo la imagen al seridor por flujo de bytes
    
//        using (Stream strm = ftp.GetRequestStream())
//        {
            
//            contentLen = fs.Read(buff, 0, buffLength);

           
//            while (contentLen != 0)
//            {
               
//                strm.Write(buff, 0, contentLen);
//                contentLen = fs.Read(buff, 0, buffLength);
//            }
//        }
      
//    }
//}






    }
}
